package com.zzs.common.core.util;

import java.util.HashMap;
import java.util.Map;

/**
 * 线程本地工具类，用于存储和获取当前线程的相关信息。
 * 目前是在common-security模块的TokenInterceptor中，存储了userId，所以可以直接在server模块和client模块直接获取userId.
 * 但是，在当前请求处理完成后，应该及时remove，避免线程污染。
 * @author zzs
 * @date 2025/03/17
 */
public class ThreadLocalUtil {
    /**
     * 线程本地变量，每个线程都有自己的独立 {@link Map}，用于存储用户相关数据。
     */
    private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = ThreadLocal.withInitial(HashMap::new);

    /**
     * 设置当前线程的用户 ID。
     * @param userId 用户 ID
     */
    public static void setUserId(Long userId) {
        THREAD_LOCAL.get().put("userId", userId);
    }

    /**
     * 获取当前线程的用户 ID。
     * @return 用户 ID，如果未设置则返回 null
     */
    public static Long getUserId() {
        Object userId = THREAD_LOCAL.get().get("userId");
        if (userId == null) {
            return null;
        }
        return (Long) userId;
    }

    /**
     * 移除当前线程的用户 ID。
     * 该方法用于防止线程复用时数据泄露，应在请求结束后调用。
     */
    public static void removeUserId() {
        THREAD_LOCAL.get().remove("userId");
    }
}
